home *** CD-ROM | disk | FTP | other *** search
/ Aminet 51 / Aminet 51 (2002)(GTI - Schatztruhe)[!][Oct 2002].iso / Aminet / dev / c / minigl.lha / MiniGL / include / mgl / mglmacros.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-07-03  |  10.5 KB  |  390 lines

  1. #ifndef MGL_MACROS_H
  2. #define MGL_MACROS_H
  3.  
  4. #ifndef NO_MGLMACROS
  5.  
  6. /*********************************************************
  7.  
  8. Marcos for in-application vertexbuffer construction.
  9.  
  10. - Should be included after gl.h.
  11.  
  12. Limitations: (for the sake of performance)
  13. - Normals not supported
  14. - glBegin/glEnd construct can not be spred across objects
  15. - Texture units are not validated with multitexturing
  16. - No color-clamping:
  17.   floats should always be in the range 0.0 - 1.0
  18.  
  19. Note: The Triangle Drawfn is decided in glEnd after checking how many verts entered the pipeline.
  20.  
  21. **********************************************************/
  22.  
  23.  
  24. extern void d_DrawPoints        (GLcontext context);
  25. extern void d_DrawLines        (GLcontext context);
  26. extern void d_DrawLineStrip        (GLcontext context);
  27. extern void d_DrawTriangleFan        (GLcontext context);
  28. extern void d_DrawTriangleStrip    (GLcontext context);
  29. extern void d_DrawQuads        (GLcontext context);
  30. extern void d_DrawNormalPoly        (GLcontext context);
  31. extern void d_DrawSmoothPoly        (GLcontext context);
  32. extern void d_DrawMtexPoly        (GLcontext context);
  33. extern void d_DrawQuadStrip        (GLcontext context);
  34. extern void d_DrawFlat        (GLcontext context);
  35.  
  36. extern GLcontext mini_CurrentContext;
  37.  
  38. #define CC mini_CurrentContext
  39.  
  40. static MGLVertex *mglvert = NULL;
  41. #define MGL_UBTOF (1.f/255.f)
  42.  
  43.  
  44. #undef glBegin
  45. #undef glTexCoord4f
  46. #undef glTexCoord2f
  47. #undef glTexCoord4fv
  48. #undef glTexCoord2fv
  49. #undef glVertex4f
  50. #undef glVertex3f
  51. #undef glVertex2f
  52. #undef glVertex2i
  53. #undef glVertex4fv
  54. #undef glVertex3fv
  55. #undef glVertex2fv
  56. #undef glColor4f
  57. #undef glColor3f
  58. #undef glColor4ub
  59. #undef glColor3ub
  60. #undef glColor4fv
  61. #undef glColor3fv
  62. #undef glColor4ubv
  63. #undef glColor3ubv
  64. #undef glActiveTextureARB
  65. #undef glMultiTexCoord2fARB
  66. #undef glMultiTexCoord2fvARB
  67. #undef glEnableClientState
  68. #undef glDisableClientState
  69. #undef glArrayElement
  70. #undef glPointSize
  71.  
  72.  
  73. // The macros:
  74.  
  75. // Texture unit selection
  76.  
  77. #define glActiveTextureARB(unit) {\
  78. CC->ActiveTexture = (GLenum)(unit) - (GLenum)GL_TEXTURE0_ARB;}
  79.  
  80. #define glBegin(mode)\
  81. {\
  82. CC->CurrentTexQValid = GL_FALSE;\
  83. \
  84. switch((int)(mode)){\
  85.     case GL_POINTS:\
  86.         CC->CurrentPrimitive = (GLenum)(mode);\
  87.         CC->CurrentDraw = (DrawFn)d_DrawPoints;\
  88.     break;\
  89.     case GL_LINES:\
  90.         CC->CurrentPrimitive = (GLenum)(mode);\
  91.         CC->CurrentDraw = (DrawFn)d_DrawLines;\
  92.     break;\
  93.     case GL_LINE_STRIP:\
  94.         CC->CurrentPrimitive = (GLenum)(mode);\
  95.         CC->CurrentDraw = (DrawFn)d_DrawLineStrip;\
  96.     break;\
  97.     case GL_LINE_LOOP:\
  98.         CC->CurrentPrimitive = (GLenum)(mode);\
  99.         CC->CurrentDraw = (DrawFn)d_DrawLineStrip;\
  100.     break;\
  101.     case GL_TRIANGLES:\
  102.         CC->CurrentPrimitive = (GLenum)(mode);\
  103.         break;\
  104.     case GL_TRIANGLE_STRIP:\
  105.         CC->CurrentPrimitive = (GLenum)(mode);\
  106.         CC->CurrentDraw = (DrawFn)d_DrawTriangleStrip;\
  107.     break;\
  108.     case GL_TRIANGLE_FAN:\
  109.         CC->CurrentPrimitive = (GLenum)(mode);\
  110.         CC->CurrentDraw = (DrawFn)d_DrawTriangleFan;\
  111.     break;\
  112.     case GL_QUADS:\
  113.         CC->CurrentPrimitive = (GLenum)(mode);\
  114.         CC->CurrentDraw = (DrawFn)d_DrawQuads;\
  115.     break;\
  116.     case GL_QUAD_STRIP:\
  117.         CC->CurrentPrimitive = (GLenum)(mode);\
  118.         CC->CurrentDraw = (DrawFn)d_DrawQuadStrip;\
  119.     break;\
  120.     case GL_POLYGON:\
  121.         CC->CurrentPrimitive = (GLenum)(mode);\
  122.         \
  123.         if (CC->Texture2D_State[1] == GL_TRUE)\
  124.         CC->CurrentDraw = (DrawFn)d_DrawMtexPoly;\
  125.         else if (CC->ShadeModel == GL_SMOOTH)\
  126.         CC->CurrentDraw = (DrawFn)d_DrawSmoothPoly;\
  127.         else\
  128.         CC->CurrentDraw = (DrawFn)d_DrawNormalPoly;\
  129.     break;\
  130.     case MGL_FLATFAN:\
  131.         CC->CurrentPrimitive = (GLenum)(mode);\
  132.         CC->CurrentDraw = (DrawFn)d_DrawFlat;\
  133.     break;\
  134.     case MGL_FLATSTRIP:\
  135.         CC->CurrentPrimitive = (GLenum)(mode);\
  136.         CC->CurrentDraw = (DrawFn)d_DrawFlat;\
  137.     break;\
  138.     default:\
  139.         GLFlagError (CC, 1, GL_INVALID_OPERATION);\
  140.     break;}\
  141. \
  142. CC->VertexBufferPointer = 0;\
  143. mglvert = &(CC->VertexBuffer[0]);\
  144. }
  145.  
  146.  
  147. //Colors
  148.  
  149. #define glColor3f(red,green,blue) {\
  150. CC->CurrentColor.r = (W3D_Float)(red);\
  151. CC->CurrentColor.g = (W3D_Float)(green);\
  152. CC->CurrentColor.b = (W3D_Float)(blue);\
  153. CC->CurrentColor.a = 1.f;\
  154. CC->UpdateCurrentColor = GL_TRUE;}
  155.  
  156. #define glColor4f(red,green,blue,alpha) {\
  157. CC->CurrentColor.r = (W3D_Float)(red);\
  158. CC->CurrentColor.g = (W3D_Float)(green);\
  159. CC->CurrentColor.b = (W3D_Float)(blue);\
  160. CC->CurrentColor.a = (W3D_Float)(alpha);\
  161. CC->UpdateCurrentColor = GL_TRUE;}
  162.  
  163. #define glColor3ub(red,green,blue) {\
  164. CC->CurrentColor.r = (W3D_Float)(red)*MGL_UBTOF;\
  165. CC->CurrentColor.g = (W3D_Float)(green)*MGL_UBTOF;\
  166. CC->CurrentColor.b = (W3D_Float)(blue)*MGL_UBTOF;\
  167. CC->CurrentColor.a = 1.f;\
  168. CC->UpdateCurrentColor = GL_TRUE;}
  169.  
  170. #define glColor4ub(red,green,blue,alpha) {\
  171. CC->CurrentColor.r = (W3D_Float)(red)*MGL_UBTOF;\
  172. CC->CurrentColor.g = (W3D_Float)(green)*MGL_UBTOF;\
  173. CC->CurrentColor.b = (W3D_Float)(blue)*MGL_UBTOF;\
  174. CC->CurrentColor.a = (W3D_Float)(alpha)*MGL_UBTOF;\
  175. CC->UpdateCurrentColor = GL_TRUE;}
  176.  
  177. //pointer versions
  178.  
  179. #define glColor3fv(color) {\
  180. CC->CurrentColor.r = ((GLfloat*)(color))[0];\
  181. CC->CurrentColor.g = ((GLfloat*)(color))[1];\
  182. CC->CurrentColor.b = ((GLfloat*)(color))[2];\
  183. CC->CurrentColor.a = 1.f;\
  184. CC->UpdateCurrentColor = GL_TRUE;}
  185.  
  186. #define glColor4fv(color) {\
  187. CC->CurrentColor.r = ((GLfloat*)(color))[0];\
  188. CC->CurrentColor.g = ((GLfloat*)(color))[1];\
  189. CC->CurrentColor.b = ((GLfloat*)(color))[2];\
  190. CC->CurrentColor.a = ((GLfloat*)(color))[3];\
  191. CC->UpdateCurrentColor = GL_TRUE;}
  192.  
  193. #define glColor3ubv(color) {\
  194. CC->CurrentColor.r = (W3D_Float)((GLubyte*)(color))[0]*MGL_UBTOF;\
  195. CC->CurrentColor.g = (W3D_Float)((GLubyte*)(color))[1]*MGL_UBTOF;\
  196. CC->CurrentColor.b = (W3D_Float)((GLubyte*)(color))[2]*MGL_UBTOF;\
  197. CC->CurrentColor.a = 1.f;\
  198. CC->UpdateCurrentColor = GL_TRUE;}
  199.  
  200. #define glColor4ubv(color) {\
  201. CC->CurrentColor.r = (W3D_Float)((GLubyte*)(color))[0]*MGL_UBTOF;\
  202. CC->CurrentColor.g = (W3D_Float)((GLubyte*)(color))[1]*MGL_UBTOF;\
  203. CC->CurrentColor.b = (W3D_Float)((GLubyte*)(color))[2]*MGL_UBTOF;\
  204. CC->CurrentColor.a = (W3D_Float)((GLubyte*)(color))[3]*MGL_UBTOF;\
  205. CC->UpdateCurrentColor = GL_TRUE;}
  206.  
  207.  
  208. //Texcoords
  209.  
  210. #define glTexCoord4f(s,t,r,q) {\
  211. mglvert->v.u = (W3D_Float)((GLfloat)(s)/(GLfloat)(q));\
  212. mglvert->v.v = (W3D_Float)((GLfloat)(t)/(GLfloat)(q));\
  213. mglvert->q = (GLfloat)(q);CC->CurrentTexQValid = GL_TRUE;}
  214.  
  215. #define glTexCoord2f(s,t) {\
  216. mglvert->v.u = (W3D_Float)(s);\
  217. mglvert->v.v = (W3D_Float)(t);}
  218.  
  219. #define glMultiTexCoord2fARB(unit,s,t) {\
  220. if((GLenum)(unit) - (GLenum)GL_TEXTURE0_ARB){\
  221. mglvert->tcoord.s = (W3D_Float)(s);\
  222. mglvert->tcoord.t = (W3D_Float)(t);\
  223. }else{\
  224. mglvert->v.u = (W3D_Float)(s);\
  225. mglvert->v.v = (W3D_Float)(t);}\
  226. }
  227.  
  228. //pointer versions
  229.  
  230. #define glTexCoord4fv(coord) {\
  231. mglvert->v.u = ((GLfloat*)(coord))[0]/((GLfloat*)(coord))[3]);\
  232. mglvert->v.v = ((GLfloat*)(coord))[1]/((GLfloat*)(coord))[3]);\
  233. mglvert->q = ((GLfloat*)(coord))[3];CC->CurrentTexQValid = GL_TRUE;}
  234.  
  235. #define glTexCoord2fv(coord) {\
  236. mglvert->v.u = ((GLfloat*)(coord))[0];\
  237. mglvert->v.v = ((GLfloat*)(coord))[1];}
  238.  
  239. #define glMultiTexCoord2fvARB(unit, coord) {\
  240. if((GLenum)(unit) - (GLenum)GL_TEXTURE0_ARB){\
  241. mglvert->tcoord.s = ((GLfloat*)(coord))[0];\
  242. mglvert->tcoord.t = ((GLfloat*)(coord))[1];\
  243. }else{\
  244. mglvert->v.u = ((GLfloat*)(coord))[0];\
  245. mglvert->v.v = ((GLfloat*)(coord))[1];}\
  246. }
  247.  
  248.  
  249. //Verts
  250.  
  251. #define glVertex4f(x,y,z,w) {\
  252. if(CC->ShadeModel == GL_SMOOTH)\
  253. {\
  254. mglvert->v.color.r = CC->CurrentColor.r;\
  255. mglvert->v.color.g = CC->CurrentColor.g;\
  256. mglvert->v.color.b = CC->CurrentColor.b;\
  257. mglvert->v.color.a = CC->CurrentColor.a;\
  258. }\
  259. mglvert->bx=(GLfloat)(x);\
  260. mglvert->by=(GLfloat)(y);\
  261. mglvert->bz=(GLfloat)(z);\
  262. mglvert->bw=(GLfloat)(w);\
  263. CC->VertexBufferPointer++;\
  264. mglvert++;\
  265. }\
  266.  
  267. #define glVertex3f(x,y,z) {\
  268. if(CC->ShadeModel == GL_SMOOTH)\
  269. {\
  270. mglvert->v.color.r = CC->CurrentColor.r;\
  271. mglvert->v.color.g = CC->CurrentColor.g;\
  272. mglvert->v.color.b = CC->CurrentColor.b;\
  273. mglvert->v.color.a = CC->CurrentColor.a;\
  274. }\
  275. mglvert->bx=(GLfloat)(x);\
  276. mglvert->by=(GLfloat)(y);\
  277. mglvert->bz=(GLfloat)(z);\
  278. mglvert->bw=(GLfloat)1.f;\
  279. CC->VertexBufferPointer++;\
  280. mglvert++;\
  281. }\
  282.  
  283. #define glVertex2f(x,y) {\
  284. if(CC->ShadeModel == GL_SMOOTH)\
  285. {\
  286. mglvert->v.color.r = CC->CurrentColor.r;\
  287. mglvert->v.color.g = CC->CurrentColor.g;\
  288. mglvert->v.color.b = CC->CurrentColor.b;\
  289. mglvert->v.color.a = CC->CurrentColor.a;\
  290. }\
  291. mglvert->bx=(GLfloat)(x);\
  292. mglvert->by=(GLfloat)(y);\
  293. mglvert->bz=(GLfloat)0.f;\
  294. mglvert->bw=(GLfloat)1.f;\
  295. CC->VertexBufferPointer++;\
  296. mglvert++;\
  297. }\
  298.  
  299. //pointer versions
  300.  
  301. #define glVertex4fv(vtx) {\
  302. if(CC->ShadeModel == GL_SMOOTH)\
  303. {\
  304. mglvert->v.color.r = CC->CurrentColor.r;\
  305. mglvert->v.color.g = CC->CurrentColor.g;\
  306. mglvert->v.color.b = CC->CurrentColor.b;\
  307. mglvert->v.color.a = CC->CurrentColor.a;\
  308. }\
  309. mglvert->bx = ((GLfloat*)(vtx))[0];\
  310. mglvert->by = ((GLfloat*)(vtx))[1];\
  311. mglvert->bz = ((GLfloat*)(vtx))[2];\
  312. mglvert->bw = ((GLfloat*)(vtx))[3];\
  313. CC->VertexBufferPointer++;\
  314. mglvert++;\
  315. }\
  316.  
  317. #define glVertex3fv(vtx) {\
  318. if(CC->ShadeModel == GL_SMOOTH)\
  319. {\
  320. mglvert->v.color.r = CC->CurrentColor.r;\
  321. mglvert->v.color.g = CC->CurrentColor.g;\
  322. mglvert->v.color.b = CC->CurrentColor.b;\
  323. mglvert->v.color.a = CC->CurrentColor.a;\
  324. }\
  325. mglvert->bx = ((GLfloat*)(vtx))[0];\
  326. mglvert->by = ((GLfloat*)(vtx))[1];\
  327. mglvert->bz = ((GLfloat*)(vtx))[2];\
  328. mglvert->bw = (GLfloat)1.f;\
  329. CC->VertexBufferPointer++;\
  330. mglvert++;\
  331. }\
  332.  
  333. #define glVertex2fv(vtx) {\
  334. if(CC->ShadeModel == GL_SMOOTH)\
  335. {\
  336. mglvert->v.color.r = CC->CurrentColor.r;\
  337. mglvert->v.color.g = CC->CurrentColor.g;\
  338. mglvert->v.color.b = CC->CurrentColor.b;\
  339. mglvert->v.color.a = CC->CurrentColor.a;\
  340. }\
  341. mglvert->bx = ((GLfloat*)(vtx))[0];\
  342. mglvert->by = ((GLfloat*)(vtx))[1];\
  343. mglvert->bz = (GLfloat)0.f;\
  344. mglvert->bw = (GLfloat)1.f;\
  345. CC->VertexBufferPointer++;\
  346. mglvert++;\
  347. }\
  348.  
  349. #define glVertex2i(ax,ay) {mglVertex2f((GLfloat)(ax),(GLfloat)(ay))}
  350.  
  351.  
  352. //Client states
  353.  
  354. #ifdef VA_SANITY_CHECK
  355.  
  356.     extern void Swap_TextureCoordPointers(GLcontext context, GLboolean enable);
  357.  
  358. #else 
  359.  
  360.     #define Swap_TextureCoordPointers(c,e) {}
  361.  
  362. #endif
  363.  
  364.  
  365. #define glEnableClientState(state) {\
  366. switch((GLenum)(state)) {\
  367. case GL_TEXTURE_COORD_ARRAY:CC->ClientState |= GLCS_TEXTURE;Swap_TextureCoordPointers(CC, GL_TRUE);break;\
  368. case GL_COLOR_ARRAY:CC->ClientState |= GLCS_COLOR;break;\
  369. case GL_VERTEX_ARRAY:CC->ClientState |= GLCS_VERTEX;break;\
  370. default:GLFlagError(context, 1, GL_INVALID_ENUM);break;} }
  371.  
  372. #define glDisableClientState(state) {\
  373. switch((GLenum)(state)) {\
  374. case GL_TEXTURE_COORD_ARRAY:CC->ClientState &= ~GLCS_TEXTURE;Swap_TextureCoordPointers(CC, GL_FALSE);break;\
  375. case GL_COLOR_ARRAY:CC->ClientState &= ~GLCS_COLOR;break;\
  376. case GL_VERTEX_ARRAY:CC->ClientState &= ~GLCS_VERTEX;break;\
  377. default:GLFlagError(context, 1, GL_INVALID_ENUM);break;} }
  378.  
  379.  
  380. //index generation in glBegin/glEnd construct:
  381.  
  382. #define glArrayElement(element) {\
  383. CC->ElementIndex[CC->VertexBufferPointer++] = (UWORD)(element);}
  384.  
  385. #define glPointSize(size) {\
  386. CC->CurrentPointSize = (GLfloat)(size);}
  387.  
  388. #endif
  389.  
  390. #endif